#include <iostream>
#include <vector>
#include <string>
#include <sqlite3.h>
/*
  封装一个sqliteHelper类，封装简单的sqlite数据库操作接口，完成数据库的基础增删改查功能
  1.创建/打开数据库文件
  2.执行操作：
    a.表操作
    b.数据操作
  3.关闭数据库
*/

using namespace std;

class SqliteHelper
{
public:
    typedef int (*SqliteCallback)(void *, int, char **, char **);
    SqliteHelper(const string &dbfile) : _dbfile(dbfile) {}
    bool open(int safe_level = SQLITE_OPEN_FULLMUTEX) // 打开数据库文件：默认串行模式
    {
        // int sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs );
        int ret = sqlite3_open_v2(_dbfile.c_str(), &_handler, SQLITE_OPEN_READWRITE /*读写*/ | SQLITE_OPEN_CREATE /*创建*/ | safe_level /*安全模式*/, NULL);
        if (ret != SQLITE_OK)
        {
            cout << "创建/打开数据库文件:" << _dbfile << " 失败" << endl;
            cout << sqlite3_errmsg(_handler) << endl;
            return false;
        }
        return true;
    }
    bool exec(const string &sql, SqliteCallback cb, void *args) // 执行sql语句：增删改查，并通过回调函数返回结果
    {
        // int sqlite3_exec(sqlite3 *, char *sql, int (*callback)(void *, int, char **, char **), void *arg, char **err);
        int ret = sqlite3_exec(_handler, sql.c_str(), cb, args, NULL);
        if (ret != SQLITE_OK)
        {
            cout << "执行sql语句:" << sql << " 失败" << endl;
            cout << sqlite3_errmsg(_handler) << endl;
            return false;
        }
        return true;
    }
    void close()
    {
        if (_handler)
            sqlite3_close_v2(_handler);
    }

private:
    sqlite3 *_handler; // 数据库操作句柄
    string _dbfile;    // 数据库文件名称
    // 一库一文件
};